package grun

//import "C"
import (
	"bytes"
	"compress/gzip"
	"crypto/sha256"
	"encoding/hex"
	"math/rand"
	"sort"
	"strconv"
	"time"
)

// IsStrInList 判断一个字符串是否在一个字符串列表中（顺序查找）
func IsStrInList(str string, listCandidate []string) bool {
	for _, element := range listCandidate {
		if str == element {
			return true
		}
	}
	return false
}

// IsStrInListBinarySearch 判断一个字符串是否在一个字符串列表中（二分查找）
func IsStrInListBinarySearch(target string, listCandidate []string) bool {
	sort.Strings(listCandidate)
	index := sort.SearchStrings(listCandidate, target)
	if index < len(listCandidate) && listCandidate[index] == target {
		return true
	}
	return false
}

// IsListInList 判断一个列表是否在另一个列表中(子集)
func IsListInList(subset, superset []string) bool {
	// 创建一个map记录superset中的元素
	set := make(map[string]bool)
	for _, s := range superset {
		set[s] = true
	}

	// 遍历subset，检查每个元素是否都在superset中
	for _, elem := range subset {
		if !set[elem] {
			return false
		}
	}
	return true
}

const (
	CharsetAlpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	CharsetDigit = "0123456789"
	CharsetUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	CharsetLower = "abcdefghijklmnopqrstuvwxyz"
	CharsetAlnum = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
)

// GenerateRandomString 生成指定长度的随机字符串
func GenerateRandomString(length int, CharsetList ...string) string {
	b := make([]byte, length)
	CharsetChoose := ""
	if len(CharsetList) == 0 {
		CharsetChoose = CharsetAlnum
	} else {
		for _, Charset := range CharsetList {
			CharsetChoose = CharsetChoose + Charset
		}
	}
	for i := range b {
		b[i] = CharsetChoose[rand.Intn(len(CharsetChoose))]
	}
	return string(b)
}

// CompressString 进行字符串压缩
func CompressString(str string) ([]byte, error) {
	var b bytes.Buffer
	w := gzip.NewWriter(&b)
	_, err := w.Write([]byte(str))
	if err != nil {
		return nil, err
	}
	err = w.Close()
	if err != nil {
		return nil, err
	}
	return b.Bytes(), nil
}

// DecompressString 将压缩的字符串进行解压
func DecompressString(compressedData []byte) (string, error) {
	r, err := gzip.NewReader(bytes.NewReader(compressedData))
	if err != nil {
		return "", err
	}
	defer func(r *gzip.Reader) {
		_ = r.Close()
	}(r)

	buf := new(bytes.Buffer)
	_, err = buf.ReadFrom(r)
	if err != nil {
		return "", err
	}
	return buf.String(), nil
}

// GenRandomId 生成一个随机ID 要求：雪花算法 方法：时间戳+随机数，凑成64位
func GenRandomId() string {
	prefix := time.UTC.String() + strconv.FormatInt(time.Now().UnixNano(), 10)
	prefix += GenerateRandomString(64-len(prefix), CharsetLower)
	return prefix
}

// GetHash 计算字符串的哈希值
func GetHash(str string) string {
	hash := sha256.Sum256([]byte(str))
	return hex.EncodeToString(hash[:])
}
